home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Publication 19
/
Publication_19_19xx_Civitas_de_Side_B.d64
/
flop v1.1-ascii
< prev
next >
Wrap
Text File
|
2023-02-26
|
17KB
|
800 lines
+cbmstart =$c000
+readpuf =$0400
+dirpuf =$0500
{CBM-A}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{CBM-S}
{$7d}cbmstart:startadresse im 64er {$7d}
{$7d} {$7d}
{$7d}readpuf :speicher fuer empfangenen {$7d}
{$7d} sektor {$7d}
{$7d}dirpuf :speicher fuer directory {$7d}
{CBM-Z}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{CBM-X}
.goto weiter
_gby
bvc * ;ein byte vom
clv ;rw-kopf holen
lda $1c01
.endmacro
_tra
bit $1800 ;auf atn warten
bpl *-3 ;$8f ist ein
.b $8f,$00,$18;illegaler, der
;(akku and x)
;ablegt
bit $1800 ;auf atn clear
bmi *-3 ;warten
.endmacro
_weiter
{CBM-A}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{CBM-S}
{$7d}computer-teil {$7d}
{CBM-Z}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{CBM-X}
.setpc cbmstart
+listen =$ffb1
+seclst =$ff93
+iecout =$ffa8
+unlist =$ffae
+flopstart=$0500
.begin
jmp install
jmp load
jmp motoroff
jmp reset
jmp settrs
jmp read
jmp trackpos
jmp test
jmp cachedir
jmp finddir
-error sec
rts
;alle 64 byte findet sich was von der
;rdtab. etwas unuebersichtlich..
+rdtab .b 255,255,255,255
;{$60}{$60}{$60}{$60} sendet xreg zur floppy {$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
;{$60}{$60}{$60}{$60} erg: c=0,z=0,a=0,y=8,x=unv.
+send
bit $dd00
bmi send ; oder bmi error
bvs send ; bvs error
ldy#8
sty $dd00
lda sendtab,x
and#240
sta $dd00
lsr
lsr
nop
nop
and#240
nop
sty $dd00
nop
nop
sta $dd00
lda sendtab,x
asl
asl
nop
sty $dd00
nop
nop
sta $dd00
clc
nop
lda#0
nop
nop
sta $dd00
rts
.fill (rdtab+64-*,0)
-rdtab2 .b 191,191,191,191
;{$60}{$60}{$60}{$60} hilft beim testen des interleaves
; fuer bereich xreg und ilv yreg
+test lda trtab,x
sta ts2+1
lda mxtab,x
sta mx
sty ilv+1
lda#0
sta sect
-ts2 ldx#123
ldy sect
jsr settrs
-ilv lda#4 ;interleave
adc sect
-ts3 cmp mx ;anzahl sektoren
bcc ts4
sbc mx
-ts4 sta sect
jsr read
inc 53280
inc 2023
bne ts2
rts
-trtab .b 31,25,18,17
.fill (rdtab+128-*,0)
-rdtab3 .b 127,127,127,127
-mxtab .b 17,18,19,21
-sect .b 0
-mx .b 0
{$60}{$60}{$60}{$60}{$60} lader ausschalten {$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
+reset ldx#0
jmp send
+getbyte
inx
lda readpuf,x
cpx blockmax
beq gb2
rts
-gb2 lda fertig
beq gb2-1
sty indexmerk
jsr read
ldy readpuf+1
ldx readpuf
bne mehrblock
iny
sty blockmax
stx fertig
ldy indexmerk
inx
bne getbyte
.fill (rdtab+192-*,0)
-rdtab4 .b 63,63,63,63
-mehrblock
jsr settrs
ldy indexmerk
ldx#1
bne getbyte
-fertig .b 0
-blockmax .b 0
-indexmerk .b 0
{$60}{$60}{$60}{$60}{$60} laedt eine datei ab track (xreg)
und sektor (yreg)
+load
jsr settrs
ldx#1
stx fertig
dex
stx blockmax
dex
jsr getbyte
sta 45
jsr getbyte
sta 46
ldy#0
-load1 jsr getbyte
beq load2
sta (45),y
iny
bne load1
inc 46
bne load1
-load2
iny
bne ld3
inc 46
-ld3 sty 45
rts
{$60}{$60}{$60}{$60}{$60} motor ausschalten {$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
+motoroff ldx#62
jmp send
{$60}{$60}{$60}{$60}{$60} motor einschalten, positionieren
xreg=tracknummer
+trackpos stx lade2+1
lda#63
jmp lade3
;{$60}{$60}{$60}{$60} uebermittelt track (xreg) und
; sektor (yreg)
+settrs sty lade2+1
-lade3 jsr send
-lade2 ldx#0
jsr send
rts
+sendtab
.b %00000000,%00001000
.b %10000000,%10001000
.b %00000100,%00001100
.b %10000100,%10001100
.b %00100000,%00101000
.b %10100000,%10101000
.b %00100100,%00101100
.b %10100100,%10101100
.b %01000000,%01001000
.b %11000000,%11001000
.b %01000100,%01001100
.b %11000100,%11001100
.b %01100000,%01101000
.b %11100000,%11101000
.b %01100100,%01101100
.b %11100100,%11101100
.b %00010000,%00011000
.b %10010000,%10011000
.b %00010100,%00011100
.b %10010100,%10011100
.b %00110000,%00111000
.b %10110000,%10111000
.b %00110100,%00111100
.b %10110100,%10111100
.b %01010000,%01011000
.b %11010000,%11011000
.b %01010100,%01011100
.b %11010100,%11011100
.b %01110000,%01111000
.b %11110000,%11111000
.b %01110100,%01111100
.b %11110100,%11111100
-rerror sec
rts
{$60}{$60}{$60}{$60}{$60} liest einen block in den puffer
readpuf1
{$60}{$60}{$60}{$60}{$60} erg: c=0,z=0,x=0,a=0,y=8
+read bit $dd00
bmi read ; oder bmi rerror
bvc read ; oder bvc rerror
ldx#0 ;wert fuer atn=0
ldy#128
sty incr+1
ldy#8 ;wert fuer atn=1
sty $dd00
stx incr+1
-re1 stx $dd00
nop
lda $dd00 ;eor $dd00 aus.
sty $dd00
inc incr+1
stx $dd00
lsr
lsr
eor $dd00
sty $dd00
lsr
lsr
stx $dd00
nop
eor $dd00
sty $dd00
lsr
lsr
stx $dd00
nop
ldx $dd00
eor rdtab,x ;die 2 unteren
;bits von $dd00
sty $dd00 ;enthalten muell
+incr sta readpuf ;aus $dd02, der
ldx#0 ;unbekannt ist,
lda incr+1 ;daher scheidet
bne re1 ;ein simples
;eor $dd00 aus
nop
nop
stx $dd00
clc
rts
{$60}{$60}{$60}{$60}{$60} installiert das system
+install lda#>puffer
ldx#>flopstart
stx hi+1
sta tr1+2
ldy#0
+system sei
lda#8
jsr listen
lda#$6f
jsr seclst
lda#"m"
jsr iecout
lda#"-"
jsr iecout
lda#"w"
jsr iecout
tya
jsr iecout
-hi lda#0
jsr iecout
lda#16
tax
jsr iecout
-tr1 lda puffer,y
jsr iecout
iny
dex
bne tr1
lda#8
jsr unlist
cpy#0
bne system
inc tr1+2
inc hi+1
lda hi+1
cmp#>(flopstart)+3
bcc system
lda#8
jsr listen
lda#$6f
jsr seclst
lda#"u" ;start bei
jsr iecout ;$0500
lda#"3"
jsr iecout
jsr unlist
cli
ldy#0
nop
dey
bne *-2
lda $dd00 ;init $dd02
and#3
eor#63
sta $dd02
lda#0
sta $dd00
rts
{$60}{$60}{$60}{$60}{$60} liest 2 zeichen der ersten 64
files und die tr/sec-adresse
erg: c=0 : ok
c=1 >= 64 files gelesen
+cachedir
ldx#18
ldy#0
tya
-cda sta dirpuf,y
iny
bne cda
ldy#63
sty indexmerk
ldy#1
-cd0
jsr settrs
jsr read
ldy#0
ldx indexmerk
-cd1
lda readpuf+2,y
bpl cd2
lda readpuf+3,y
sta dirpuf,x
lda readpuf+4,y
sta dirpuf+64,x
lda readpuf+5,y
sta dirpuf+128,x
lda readpuf+6,y
sta dirpuf+192,x
dex
bmi cd3
-cd2 tya
clc
adc#$20
tay
bcc cd1
stx indexmerk
ldy readpuf+1
ldx readpuf
bne cd0
clc
rts
-cd3 sec
rts
{$60}{$60}{$60}{$60}{$60} rechnet den 2-zeichen-filenamen
in tr/sec um
erg: c=0 : ok
c=1 : nicht gefunden
x/y : tr/sec
+finddir
sty indexmerk
ldy#63
-fn1
lda indexmerk
cmp dirpuf+192,y
bne fn2
txa
cmp dirpuf+128,y
bne fn2
lda dirpuf,y
tax
lda dirpuf+64,y
tay
clc
rts
-fn2 dey
bpl fn1
sec
rts
.end
.fill (256-<*,0)
+puffer =*
{CBM-A}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{CBM-S}
{$7d}floppy-teil {$7d}
{$7d}unbenutzte speicherbereiche: {$7d}
{$7d}$0340-$04ff {$7d}
{$7d}$20-$3f {$7d}
{CBM-Z}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{CBM-X}
.setpc flopstart
.buffer (puffer,puffer+$2ff)
.begin
{$60}{$60}{$60}{$60}{$60} tabellen {$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
+t1 =$040
+t2 =$080
+t4 =$0c0
+t3 =$200
+t5 =$240
+t6 =$280
+t7 =$2c0
+t8 =$300
+tabloorg =$f8c0
+tabhiorg =$f8a0
{$60}{$60}{$60}{$60}{$60} variablen {$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
+wunschtrack =$00
+wunschsektor =$01
+lastbyte =$02
+motorflag =$03
+fmem =$04
{$60}{$60}{$60}{$60}{$60} konstanten {$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}{$60}
+sendvalue =$02
+receivevalue =$0a
+busyvalue =$08
+freevalue =$00
sei ;decodetabelle
ldx#23 ;kopieren, z.b.
-asa1 lda tabhi,x ;enthaelt zp23
sta 8,x ;den decodewert
dex ;fuer 5bit-
bpl asa1 ;nibble 23.
-main2 lda#0
sta motorflag
+main
ldx#255
txs
jsr input
beq ende ;b=0:ende
cmp#42
bcc tracksec
;b<42:tr/sec
cmp#63 ;b=63:settrs
bcc maus ;rest:motoraus
jsr input
sta wunschtrack
jsr readheader
jmp main
-maus
lda#255-4
and $1c00
sta $1c00
bcc main2
+ende jmp ($fffc)
-tracksec
sta wunschtrack
jsr input
sta wunschsektor
-trse1 jsr readheader
cmp wunschsektor
bne trse1
-ws4
lda $1c00 ;sync abwarten,
bmi ws4 ;jetzt liegt der
lda $1c01 ;datenblock an
clv
ldx#63 ;datenblock:
-l1 ;64*5 bytes
*gby
sta t8,x ;320 bytes
and#7 ;lesen und
sta t1,x ;decodierung
;vorbereiten
*gby
asl
rol t1,x
asl
rol t1,x
lsr
lsr
lsr
sta t7,x
*gby
sta t2,x
ror
lsr
lsr
lsr
sta t3,x
*gby
asl
rol t2,x
lsr
sta t4,x
*gby
sta t6,x
and#31
sta t5,x
dex
bpl l1
bvc * ;in den 320
clv ;bytes steckt
lda $1c01 ;das datenblock-
tay ;kennzeichen,
lsr ;hier das letzte
lsr ;byte der daten
lsr
sta dc5+1
bvc *
clv
lda $1c01
sta lastbyte
tya
asl lastbyte
rol
asl lastbyte
rol
and#31
tay
lda tablo-8,y
-dc5 ora 123
sta lastbyte
-decode ;320 byte werden
inx ;decodiert und
;auf den stapel
ldy t5,x ;gelegt.
lda t6,x
lsr t4,x
ror
lsr t4,x
ror
lsr
lsr
lsr
sta dc0+1
lda tablo-8,y
-dc0 ora 123
pha
ldy t4,x
lda t2,x
and#31
sta dc1+1
lda tablo-8,y
-dc1 ora 123
pha
lda t7,x
sta dc2+1
ldy t3,x
lda tablo-8,y
-dc2 ora 123
pha
ldy t1,x
lda t8,x
lsr
lsr
lsr
sta dc3+1
lda tablo-8,y
-dc3 ora 123
pha
cpx#63
bcc decode
pla ;datenblockkz
lda lastbyte ;durch letztes
pha ;datenbyte ers.
-transfer
ldx#1
txs
ldy#0 ;2*128 bytes
ldx#15 ;and-maske
lda#sendvalue
sta $1800
-tr1
pla
asl
*tra
ror
*tra
lsr
lsr
lsr
*tra
lsr
*tra
dey
bne tr1
bit $1800
bpl *-3
bit $1800
bmi *-3
jmp main
+readheader
jsr motorein
lda $1c0c ;init lesen
ora#$0e
sta $1c0c
-waitheader
lda $1c00 ;sync abwarten
bmi waitheader
lda $1c01
clv
*gby
cmp#82 ;teil des
bne waitheader ;headerkennz.
ldx#4
-ws2
sta fmem ;3.byte=>fmem
*gby ;4.byte=>akku
dex
bne ws2
tay
lsr fmem
ror
lsr fmem
ror
lsr
lsr
lsr
tax
tya
and#31
tay
lda tabloorg,y
ora tabhiorg,x ;decodieren
cmp wunschtrack
beq seccmp
jsr kopf
jmp readheader+3
-seccmp
lda fmem ;track war
and#31 ;richtig,
tax ;sektornummer
eor fmem ;in den akku
lsr
ora tabloorg,x
rts
+input
lda#8 ;led ein
ora $1c00
sta $1c00
lda#receivevalue
sta $1800
ldy $1800:bpl *-3
lda#freevalue ;init
sta $1800
ldy $1800:bmi *-3
lda $1800
and#5
asl
ldy $1800:bpl *-3
ldy $1800:bmi *-3
ora $1800
and#15
tax
ldy $1800:bpl *-3
ldy $1800:bmi *-3
lda $1800
and#5
ora inputtab,x
tax
lda#busyvalue
sta $1800
lda $1c00 ;led aus
and#255-8
sta $1c00
txa
rts
+inputtab
.b %00000000,%00000010
.b %00001000,%00001010
.b %00010000,%00010010
.b %00011000,%00011010
.b %00100000,%00100010
.b %00101000,%00101010
.b %00110000,%00110010
.b %00111000,%00111010
+kopf
ldx#202 ;dex
sec
sbc wunschtrack
bcs ok ;differenz
ldx#232 ;von aktuellem
eor#255 ;und zieltrack
adc#1
-ok stx wert
asl ;bewewgung in
tay ;halftracks
ldx $1c00 ;steppermotor
-wert inx ;in den unteren
txa ;beiden bits
ora#12
sta $1c00
ldx#128+18 ;18 ist der
stx $1805 ;schlechteste
ldx $1805 ;mir bekannte
bmi *-3 ;wert fuer den
dey ;steppermotor
bne wert-3
and#%10011111 ;speed in bits
ldx#0 ;5 und 6
.b $ac ;ldy abs
-speed adc#31
ldy $fed8,x ;trackliste
dey
cpy wunschtrack
inx
bcs speed
sta $1c00
rts
+motorein
lda motorflag
bne motorein-1
lda $1c00
ora#4
sta $1c00
sta motorflag
ldx#120 ;anlaufzeit
-me1 dey ;abwarten. ist
bne me1 ;mir zwar un-
dex ;klar, warum,
bne me1 ;aber ohne
rts ;geht's nicht
;in diesen beiden tabellen sind die
;bits durcheinandergewuerfelt, nach
;der uebertragung passen die dann
;wieder.
+tablo
.b $ff,%00000010,%00000000,%00000100
.b $ff,%00001010,%00001000,%00001100
.b $ff,$ff ,%00000001,%00000101
.b $ff,%00001111,%00001001,%00001101
.b $ff,%00000110,%00000011,%00000111
.b $ff,%00001110,%00001011,$ff
+tabhi
.b $ff,%00100000,%00000000,%01000000
.b $ff,%10100000,%10000000,%11000000
.b $ff,$ff ,%00010000,%01010000
.b $ff,%11110000,%10010000,%11010000
.b $ff,%01100000,%00110000,%01110000
.b $ff,%11100000,%10110000,$ff
.end